package com.链表;

import java.util.ArrayList;
import java.util.List;

/**
 * 给你一个链表的头节点 head，请你编写代码，反复删去链表中由 总和 值为 0 的连续节点组成的序列，直到不存在这样的序列为止。
 *
 * 删除完毕后，请你返回最终结果链表的头节点。
 *
 *  
 *
 * 你可以返回任何满足题目要求的答案。
 *
 * （注意，下面示例中的所有序列，都是对 ListNode 对象序列化的表示。）
 *
 * 示例 1：
 *
 * 输入：head = [1,2,-3,3,1]
 * 输出：[3,1]
 * 提示：答案 [1,2,1] 也是正确的。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/remove-zero-sum-consecutive-nodes-from-linked-list
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class 从链表中删去总和值为零的连续节点 {
   static class Solution {
        /**
         * 1.遍历出小于0的值，再算出大于0的值的和
         * @param head
         * @return
         */
        public ListNode removeZeroSumSublists(ListNode head) {
           ListNode dummy = head;

            List<Integer> list = new ArrayList<>();

            while (dummy != null){
                if(dummy.val < 0){
                    list.add(dummy.val);
                    dummy.val = 0;
                }
                dummy = dummy.next;
            }
            dummy = head;
            int sum =0;
            for(int i:list){
                sum+=i;
            }
            int add = 0;
            while (dummy != null){


                if(dummy.val > 0 ){
                   add += dummy.val;
                   dummy.val = 0;
                }
                if((add + sum) == 0){
                    dummy = dummy.next;
                    break;
                }
                dummy = dummy.next;
            }
            dummy = new ListNode(0);
            dummy.next = head;
            ListNode cur = dummy;
            while (cur.next != null){
                if(cur.next.val == 0){
                    cur.next = cur.next.next;
                }
                else{
                    cur = cur.next;
                }
            }
            return dummy.next;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        ListNode head = new ListNode(new int[]{1,2,3,4,5,-10});
        solution.removeZeroSumSublists(head);
    }
}
